#include "DmaInitHelper.h"
#include "BufDef.h"
#include "GpioInitHelper.h"
#include "UsartInitHelper.h"

// 全局变量，用于保持一些参数，并方便修改
// 串口1接收自恢复参数
//stc_dma_llp_descriptor_t rx1StcLlpDesc;
// 串口2接收自恢复参数
stc_dma_llp_descriptor_t rx2StcLlpDesc;
// 串口6接收自恢复参数
stc_dma_llp_descriptor_t rx6StcLlpDesc;
// 串口9接收自恢复参数
stc_dma_llp_descriptor_t rx9StcLlpDesc;

//Dma Config
void App_DmaCfg(void) {
  /* DMA1 FCG enable */
  FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE);
  /* DMA1 FCG enable */
  FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA2, ENABLE);
  /* AOS FCG enable */
  FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);

  stc_dma_init_t stcDmaInit;

  // 串口1参数设置 4G DMA
//  {// 初始化DMA1 CH0 串口1接收通道
//    // 串口1接收中断绑定到AOS上
//    AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_USART1_RI);
//    /* USART_RX_DMA */
//    (void) DMA_StructInit(&stcDmaInit);
//    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
//    stcDmaInit.u32BlockSize = 1UL;
//    stcDmaInit.u32TransCount = 1536;
//    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
//    stcDmaInit.u32DestAddr = (uint32_t) mqtt_usart_rx_buf;
//    stcDmaInit.u32SrcAddr = (uint32_t) (&CM_USART1->RDR);
//    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;
//    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;
//    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit);

//    if (LL_OK == i32Ret) {
//      stc_dma_llp_init_t stcDmaLlpInit;

//      (void) DMA_LlpStructInit(&stcDmaLlpInit);
//      stcDmaLlpInit.u32State = DMA_LLP_ENABLE;
//      stcDmaLlpInit.u32Mode = DMA_LLP_WAIT;
//      stcDmaLlpInit.u32Addr = (uint32_t) &rx7StcLlpDesc;
//      (void) DMA_LlpInit(CM_DMA1, DMA_CH0, &stcDmaLlpInit);

//      rx7StcLlpDesc.SARx = stcDmaInit.u32SrcAddr;
//      rx7StcLlpDesc.DARx = stcDmaInit.u32DestAddr;
//      rx7StcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
//      ;
//      rx7StcLlpDesc.LLPx = (uint32_t) &rx7StcLlpDesc;
//      rx7StcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |
//                             stcDmaInit.u32IntEn | stcDmaLlpInit.u32State | stcDmaLlpInit.u32Mode;

//      DMA_ReconfigLlpCmd(CM_DMA1, DMA_CH0, ENABLE);
//      DMA_ReconfigCmd(CM_DMA1, ENABLE);
//      AOS_SetTriggerEventSrc(AOS_DMA_RC, EVT_SRC_AOS_STRG);

//      DMA_Cmd(CM_DMA1, ENABLE);
//      DMA_TransCompleteIntCmd(CM_DMA1, DMA_INT_TC_CH0, ENABLE);
//      (void) DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
//    } else {
//      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
//      for (;;) {
//      }
//    }
//  }// 初始化DMA1 CH0 串口1接收通道

//  {// 初始化DMA1 CH1 串口1发送通道
//    /* DMA1_CH1 Config */
//    // 串口2发送中断绑定到AOS上
//    AOS_SetTriggerEventSrc(AOS_DMA1_1, EVT_SRC_USART1_TI);
//    /* USART_TX_DMA */
//    (void) DMA_StructInit(&stcDmaInit);
//    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
//    stcDmaInit.u32BlockSize = 1UL;
//    stcDmaInit.u32TransCount = 0UL;
//    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
//    stcDmaInit.u32DestAddr = (uint32_t) (&CM_USART1->TDR);
//    stcDmaInit.u32SrcAddr = (uint32_t) 0;
//    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
//    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
//    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit);

//    if (LL_OK == i32Ret) {

//      DMA_Cmd(CM_DMA1, ENABLE);

//    } else {
//      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
//      for (;;) {
//      }
//    }
//  }// 初始化DMA1 CH1 串口1发送通道

  /**
	* 串口2参数设置 RS485-1 DMA
	*/
  {// 初始化DMA1 CH3 串口2接收通道
    // 串口2接收中断绑定到AOS上
    AOS_SetTriggerEventSrc(AOS_DMA1_3, EVT_SRC_USART2_RI);
    /* USART_RX_DMA */
    (void) DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 1536;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t) NULL;
    stcDmaInit.u32SrcAddr = (uint32_t) (&CM_USART2->RDR);
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;
    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH3, &stcDmaInit);

    if (LL_OK == i32Ret) {
      stc_dma_llp_init_t stcDmaLlpInit;

      (void) DMA_LlpStructInit(&stcDmaLlpInit);
      stcDmaLlpInit.u32State = DMA_LLP_ENABLE;
      stcDmaLlpInit.u32Mode = DMA_LLP_WAIT;
      stcDmaLlpInit.u32Addr = (uint32_t) &rx2StcLlpDesc;
      (void) DMA_LlpInit(CM_DMA1, DMA_CH3, &stcDmaLlpInit);

      rx2StcLlpDesc.SARx = stcDmaInit.u32SrcAddr;
      rx2StcLlpDesc.DARx = stcDmaInit.u32DestAddr;
      rx2StcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
      ;
      rx2StcLlpDesc.LLPx = (uint32_t) &rx2StcLlpDesc;
      rx2StcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |
                             stcDmaInit.u32IntEn | stcDmaLlpInit.u32State | stcDmaLlpInit.u32Mode;

      DMA_ReconfigLlpCmd(CM_DMA1, DMA_CH3, ENABLE);
      DMA_ReconfigCmd(CM_DMA1, ENABLE);
      AOS_SetTriggerEventSrc(AOS_DMA_RC, EVT_SRC_AOS_STRG);

      DMA_Cmd(CM_DMA1, ENABLE);
      DMA_TransCompleteIntCmd(CM_DMA1, DMA_INT_TC_CH2, ENABLE);
      (void) DMA_ChCmd(CM_DMA1, DMA_CH3, ENABLE);
    } else {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
      for (;;) {
      }
    }
  }// 初始化DMA1 CH3 串口2接收通道

  {// 初始化串口2接收通道 RS485-1
    /* DMA2_CH6 Config */
    // 串口3发送中断绑定到AOS上
    AOS_SetTriggerEventSrc(AOS_DMA2_6, EVT_SRC_USART2_TI);
    /* USART_TX_DMA */
    (void) DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 0UL;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t) (&CM_USART2->TDR);
    stcDmaInit.u32SrcAddr = (uint32_t) 0;
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    int32_t i32Ret = DMA_Init(CM_DMA2, DMA_CH6, &stcDmaInit);

    if (LL_OK == i32Ret) {

      DMA_Cmd(CM_DMA2, ENABLE);

    } else {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
      for (;;) {
      }
    }
  }// 初始化串口2发送通道 RS485-1
   /* 串口2参数设置 北斗 DMA */

  // 串口3参数设置 控制台 DMA
  {// 初始化DMA1 CH0 串口3发送通道
    /* DMA2_CH0 Config */
    // 串口3发送中断绑定到AOS上
    AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_USART3_TI);
    /* USART_TX_DMA */
    (void) DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 0UL;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t) (&CM_USART3->TDR);
    stcDmaInit.u32SrcAddr = (uint32_t) 0;
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit);

    if (LL_OK == i32Ret) {

      DMA_Cmd(CM_DMA1, ENABLE);

    } else {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
      for (;;) {
      }
    }
  }// 初始化DMA2 CH0 串口3发送通道
  // 串口3参数设置 控制台 DMA


  // 串口6参数设置
  //  {// 初始化DMA2 CH7 串口6接收通道
  //    // 串口6接收中断绑定到AOS上
  //    AOS_SetTriggerEventSrc(AOS_DMA1_4, EVT_SRC_USART6_RI);
  //    /* USART_RX_DMA */
  //    (void) DMA_StructInit(&stcDmaInit);
  //    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
  //    stcDmaInit.u32BlockSize = 1UL;
  //    stcDmaInit.u32TransCount = 1536;
  //    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
  //    stcDmaInit.u32DestAddr = (uint32_t) rs485_2_usart_rx_buf;
  //    stcDmaInit.u32SrcAddr = (uint32_t) (&CM_USART6->RDR);
  //    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;
  //    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;
  //    int32_t i32Ret = DMA_Init(CM_DMA2, DMA_CH7, &stcDmaInit);

  //    if (LL_OK == i32Ret) {
  //      stc_dma_llp_init_t stcDmaLlpInit;

  //      (void) DMA_LlpStructInit(&stcDmaLlpInit);
  //      stcDmaLlpInit.u32State = DMA_LLP_ENABLE;
  //      stcDmaLlpInit.u32Mode = DMA_LLP_WAIT;
  //      stcDmaLlpInit.u32Addr = (uint32_t) &rx6StcLlpDesc;
  //      (void) DMA_LlpInit(CM_DMA2, DMA_CH7, &stcDmaLlpInit);

  //      rx6StcLlpDesc.SARx = stcDmaInit.u32SrcAddr;
  //      rx6StcLlpDesc.DARx = stcDmaInit.u32DestAddr;
  //      rx6StcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
  //      rx6StcLlpDesc.LLPx = (uint32_t) &rx6StcLlpDesc;
  //      rx6StcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |
  //                             stcDmaInit.u32IntEn | stcDmaLlpInit.u32State | stcDmaLlpInit.u32Mode;

  //      DMA_ReconfigLlpCmd(CM_DMA2, DMA_CH7, ENABLE);
  //      DMA_ReconfigCmd(CM_DMA2, ENABLE);
  //      AOS_SetTriggerEventSrc(AOS_DMA_RC, EVT_SRC_AOS_STRG);

  //      DMA_Cmd(CM_DMA2, ENABLE);
  //      DMA_TransCompleteIntCmd(CM_DMA2, DMA_INT_TC_CH7, ENABLE);
  //      (void) DMA_ChCmd(CM_DMA2, DMA_CH7, ENABLE);
  //    } else {
  //      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
  //      for (;;) {
  //      }
  //    }
  //  }// 初始化DMA2 CH7 串口6接收通道

  //  {// 初始化DMA1 CH2 串口6发送通道
  //    /* DMA1_CH2 Config */
  //    // 串口6发送中断绑定到AOS上
  //    AOS_SetTriggerEventSrc(AOS_DMA1_2, EVT_SRC_USART6_TI);
  //    /* USART_TX_DMA */
  //    (void) DMA_StructInit(&stcDmaInit);
  //    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
  //    stcDmaInit.u32BlockSize = 1UL;
  //    stcDmaInit.u32TransCount = 0UL;
  //    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
  //    stcDmaInit.u32DestAddr = (uint32_t) (&CM_USART6->TDR);
  //    stcDmaInit.u32SrcAddr = (uint32_t) 0;
  //    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
  //    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
  //    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH2, &stcDmaInit);

  //    if (LL_OK == i32Ret) {

  //      DMA_Cmd(CM_DMA1, ENABLE);

  //    } else {
  //      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
  //      for (;;) {
  //      }
  //    }
  //  }// 初始化DMA1 CH5 串口5发送通道
  // 串口6参数设置

  // 串口9参数设置
  {// 初始化DMA1 CH1 串口9接收通道
    // 串口9接收中断绑定到AOS上
    AOS_SetTriggerEventSrc(AOS_DMA1_1, EVT_SRC_USART9_RI);
    /* USART_RX_DMA */
    (void) DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 1020;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t) &(usart_9_rx_msq_buf[4]);
    stcDmaInit.u32SrcAddr = (uint32_t) (&CM_USART9->RDR);
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;
    int32_t i32Ret = DMA_Init(CM_DMA1, DMA_CH1, &stcDmaInit);

    if (LL_OK == i32Ret) {
      stc_dma_llp_init_t stcDmaLlpInit;

      (void) DMA_LlpStructInit(&stcDmaLlpInit);
      stcDmaLlpInit.u32State = DMA_LLP_ENABLE;
      stcDmaLlpInit.u32Mode = DMA_LLP_WAIT;
      stcDmaLlpInit.u32Addr = (uint32_t) &rx9StcLlpDesc;
      (void) DMA_LlpInit(CM_DMA1, DMA_CH1, &stcDmaLlpInit);

      rx9StcLlpDesc.SARx = stcDmaInit.u32SrcAddr;
      rx9StcLlpDesc.DARx = stcDmaInit.u32DestAddr;
      rx9StcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
      rx9StcLlpDesc.LLPx = (uint32_t) &rx9StcLlpDesc;
      rx9StcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |
                             stcDmaInit.u32IntEn | stcDmaLlpInit.u32State | stcDmaLlpInit.u32Mode;

      DMA_ReconfigLlpCmd(CM_DMA1, DMA_CH1, ENABLE);
      DMA_ReconfigCmd(CM_DMA1, ENABLE);
      AOS_SetTriggerEventSrc(AOS_DMA_RC, EVT_SRC_AOS_STRG);

      DMA_Cmd(CM_DMA1, ENABLE);
      DMA_TransCompleteIntCmd(CM_DMA1, DMA_INT_TC_CH1, ENABLE);
      (void) DMA_ChCmd(CM_DMA1, DMA_CH1, ENABLE);
    } else {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
      for (;;) {
      }
    }
  }// 初始化DMA1 CH1 串口9接收通道

  {// 初始化DMA2 CH1 串口9发送通道
    /* DMA2_CH1 Config */
    // 串口9发送中断绑定到AOS上
    AOS_SetTriggerEventSrc(AOS_DMA2_1, EVT_SRC_USART9_TI);
    /* USART_TX_DMA */
    (void) DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 0UL;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t) (&CM_USART9->TDR);
    stcDmaInit.u32SrcAddr = (uint32_t) 0;
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    int32_t i32Ret = DMA_Init(CM_DMA2, DMA_CH1, &stcDmaInit);

    if (LL_OK == i32Ret) {

      DMA_Cmd(CM_DMA2, ENABLE);

    } else {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
      for (;;) {
      }
    }
  }// 初始化DMA1 CH2 串口5发送通道
  // 串口9参数设置
}
